#!/usr/bin/env python
# -*- coding: utf-8 -*-
# --------------------------------------------------------
# Descripttion: https://github.com/fuyi501
# version: 0.0.1
# Author: Wenwei Fu (2516800961@qq.com)
# FilePath: /manage-fastapi/fastapi-realworld-example-app-mysql/app/db/schemas.py
# Create: 2021-03-31 20:45:31
# LastAuthor: Wenwei Fu
# lastTime: 2021-04-01 10:23:39
# --------------------------------------------------------

'''
salt 简介
我们知道，如果直接对密码进行散列，那么黑客可以对通过获得这个密码散列值，然后通过查散列值字典（例如 MD5 密码破解网站），得到某用户的密码。
加 Salt 可以一定程度上解决这一问题。所谓加 Salt 方法，就是加点 “佐料”。其基本想法是这样的：当用户首次提供密码时（通常是注册时），由系统自动往这个密码里撒一些 “佐料”，然后再散列。而当用户登录时，系统为用户提供的代码撒上同样的 “佐料”，然后散列，再比较散列值，已确定密码是否正确。
这里的 “佐料” 被称作 “Salt 值”，这个值是由系统随机生成的，并且只有系统知道。这样，即便两个用户使用了同一个密码，由于系统为它们生成的 salt 值不同，他们的散列值也是不同的。即便黑客可以通过自己的密码和自己生成的散列值来找具有特定密码的用户，但这个几率太小了（密码和 salt 值都得和黑客使用的一样才行）。
'''

import datetime
import uuid
from peewee import *
from app.db.database import BaseModel

# 在这里定义所有的 数据库表

# 用户表
class User(BaseModel):
    id = AutoField(primary_key=True)
    username = CharField() # 用户名
    user_phone = CharField() # 电话号码
    email = CharField() # 邮箱
    user_id = CharField(default=str(uuid.uuid1())) # 用户id
    salt = CharField() # 密码加密 salt
    hashed_password = CharField() # 密码
    bio = CharField(default="个人简介：" + str(uuid.uuid1())[:6]) # 个人简介
    image = CharField() # 头像
    created_at = DateTimeField(default=datetime.datetime.now)
    updated_at = DateTimeField(default=datetime.datetime.now)

# 道路信息表
class Traffic_Road(BaseModel):
    id = AutoField(primary_key=True)
    road_id = CharField(unique=True) # 道路ID
    road_name = CharField() # 道路名称
    road_lonlat = CharField(null=True, help_text="经纬度", verbose_name="经纬度") # 经纬度
    created_at = DateTimeField(default=datetime.datetime.now)
    updated_at = DateTimeField(default=datetime.datetime.now)

# 摄像头列表
class Traffic_Cameras(BaseModel):
    id = AutoField(primary_key=True)
    camera_id = CharField() # 摄像头ID
    camera_name = CharField() # 摄像头名称
    camera_type = CharField() # 摄像头类型
    camera_lonlat = CharField(null=True, help_text="经纬度", verbose_name="经纬度") # 经纬度
    camera_road_id = CharField() # 摄像头道路ID
    camera_position = CharField() # 安装位置
    camera_scene = CharField(null=True) # 镜头
    camera_video_url = CharField(null=True) # 视频流地址
    camera_original_image_url = CharField(null=True) # 原始图片地址
    camera_image_url = CharField(null=True) # 标注后的图片地址
    created_at = DateTimeField(default=datetime.datetime.now)
    updated_at = DateTimeField(default=datetime.datetime.now)

# 交通事件代码对应表
class Traffic_Event_Code(BaseModel):
    id = AutoField(primary_key=True)
    event_value = CharField() # 事件类型 code
    event_label = CharField() # 事件类型名称
    created_at = DateTimeField(default=datetime.datetime.now)
    updated_at = DateTimeField(default=datetime.datetime.now)

# 车道方向代码对应表
class Traffic_Lane_Code(BaseModel):
    id = AutoField(primary_key=True)
    lane_value = CharField() # 车道方向 code
    lane_label = CharField() # 车道方向名称
    created_at = DateTimeField(default=datetime.datetime.now)
    updated_at = DateTimeField(default=datetime.datetime.now)

# 创建数据表
def create_tables(db):
    db.create_tables([
        User,
        Traffic_Road,
        Traffic_Cameras,
        Traffic_Event_Code,
        Traffic_Lane_Code
    ])